{
struct cpuinfo_x86 *c = &boot_cpu_data;
- if (!(xen_start_info.flags & SIF_PRIVILEGED))
+ if (!(xen_start_info->flags & SIF_PRIVILEGED))
return -ENODEV;
if ((!cpu_has(c, X86_FEATURE_MTRR)) &&
#define X86_VENDOR_ID new_cpu_data+CPUINFO_x86_vendor_id
ENTRY(startup_32)
- cld
-
- /* Copy the necessary stuff from xen_start_info structure. */
- mov $xen_start_info_union,%edi
- mov $512,%ecx
- rep movsl
+ movl %esi,xen_start_info
#ifdef CONFIG_SMP
ENTRY(startup_32_smp)
- cld
#endif /* CONFIG_SMP */
+ cld
+
/* Set up the stack pointer */
lss stack_start,%esp
int i;
/* Nothing to do if not running in dom0. */
- if (!(xen_start_info.flags & SIF_INITDOMAIN))
+ if (!(xen_start_info->flags & SIF_INITDOMAIN))
return;
/* video rom */
EXPORT_SYMBOL(phys_to_machine_mapping);
/* Raw start-of-day parameters from the hypervisor. */
-union xen_start_info_union xen_start_info_union;
+start_info_t *xen_start_info;
static void __init limit_regions(unsigned long long size)
{
if ((max_cmdline = MAX_GUEST_CMDLINE) > COMMAND_LINE_SIZE)
max_cmdline = COMMAND_LINE_SIZE;
- memcpy(saved_command_line, xen_start_info.cmd_line, max_cmdline);
+ memcpy(saved_command_line, xen_start_info->cmd_line, max_cmdline);
/* Save unparsed command line copy for /proc/cmdline */
saved_command_line[max_cmdline-1] = '\0';
/* We don't use the fake e820 because we need to respond to user override. */
void __init find_max_pfn(void)
{
- if ( xen_override_max_pfn < xen_start_info.nr_pages )
- xen_override_max_pfn = xen_start_info.nr_pages;
+ if ( xen_override_max_pfn < xen_start_info->nr_pages )
+ xen_override_max_pfn = xen_start_info->nr_pages;
max_pfn = xen_override_max_pfn;
}
#endif /* XEN */
* partially used pages are not usable - thus
* we are rounding upwards:
*/
- min_low_pfn = PFN_UP(__pa(xen_start_info.pt_base)) +
- xen_start_info.nr_pt_frames;
+ min_low_pfn = PFN_UP(__pa(xen_start_info->pt_base)) +
+ xen_start_info->nr_pt_frames;
find_max_pfn();
#endif /* !CONFIG_XEN */
#ifdef CONFIG_BLK_DEV_INITRD
- if (xen_start_info.mod_start) {
+ if (xen_start_info->mod_start) {
if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) {
/*reserve_bootmem(INITRD_START, INITRD_SIZE);*/
initrd_start = INITRD_START + PAGE_OFFSET;
}
#endif
- phys_to_machine_mapping = (unsigned int *)xen_start_info.mfn_list;
+ phys_to_machine_mapping = (unsigned int *)xen_start_info->mfn_list;
}
/*
else
legacy_init_iomem_resources(&code_resource, &data_resource);
- if (xen_start_info.flags & SIF_INITDOMAIN)
+ if (xen_start_info->flags & SIF_INITDOMAIN)
/* EFI systems may still have VGA */
request_resource(&iomem_resource, &video_ram_resource);
init_mm.start_code = (unsigned long) _text;
init_mm.end_code = (unsigned long) _etext;
init_mm.end_data = (unsigned long) _edata;
- init_mm.brk = (PFN_UP(__pa(xen_start_info.pt_base)) +
- xen_start_info.nr_pt_frames) << PAGE_SHIFT;
+ init_mm.brk = (PFN_UP(__pa(xen_start_info->pt_base)) +
+ xen_start_info->nr_pt_frames) << PAGE_SHIFT;
/* XEN: This is nonsense: kernel may not even be contiguous in RAM. */
/*code_resource.start = virt_to_phys(_text);*/
#endif
/* Make sure we have a correctly sized P->M table. */
- if (max_pfn != xen_start_info.nr_pages) {
+ if (max_pfn != xen_start_info->nr_pages) {
phys_to_machine_mapping = alloc_bootmem_low_pages(
max_pfn * sizeof(unsigned int));
- if (max_pfn > xen_start_info.nr_pages) {
+ if (max_pfn > xen_start_info->nr_pages) {
/* set to INVALID_P2M_ENTRY */
memset(phys_to_machine_mapping, ~0,
max_pfn * sizeof(unsigned int));
memcpy(phys_to_machine_mapping,
- (unsigned int *)xen_start_info.mfn_list,
- xen_start_info.nr_pages * sizeof(unsigned int));
+ (unsigned int *)xen_start_info->mfn_list,
+ xen_start_info->nr_pages * sizeof(unsigned int));
} else {
struct xen_memory_reservation reservation = {
- .extent_start = (unsigned long *)xen_start_info.mfn_list + max_pfn,
- .nr_extents = xen_start_info.nr_pages - max_pfn,
+ .extent_start = (unsigned long *)xen_start_info->mfn_list + max_pfn,
+ .nr_extents = xen_start_info->nr_pages - max_pfn,
.extent_order = 0,
.domid = DOMID_SELF
};
memcpy(phys_to_machine_mapping,
- (unsigned int *)xen_start_info.mfn_list,
+ (unsigned int *)xen_start_info->mfn_list,
max_pfn * sizeof(unsigned int));
/* N.B. below relies on sizeof(int) == sizeof(long). */
BUG_ON(HYPERVISOR_memory_op(
XENMEM_decrease_reservation,
&reservation) !=
- (xen_start_info.nr_pages - max_pfn));
+ (xen_start_info->nr_pages - max_pfn));
}
free_bootmem(
- __pa(xen_start_info.mfn_list),
- PFN_PHYS(PFN_UP(xen_start_info.nr_pages *
+ __pa(xen_start_info->mfn_list),
+ PFN_PHYS(PFN_UP(xen_start_info->nr_pages *
sizeof(unsigned int))));
}
}
#endif
- if (xen_start_info.flags & SIF_INITDOMAIN)
+ if (xen_start_info->flags & SIF_INITDOMAIN)
dmi_scan_machine();
#ifdef CONFIG_X86_GENERICARCH
HYPERVISOR_physdev_op(&op);
#ifdef CONFIG_ACPI_BOOT
- if (!(xen_start_info.flags & SIF_INITDOMAIN)) {
+ if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
printk(KERN_INFO "ACPI in unprivileged domain disabled\n");
acpi_disabled = 1;
acpi_ht = 0;
register_memory();
- if (xen_start_info.flags & SIF_INITDOMAIN) {
- if (!(xen_start_info.flags & SIF_PRIVILEGED))
+ if (xen_start_info->flags & SIF_INITDOMAIN) {
+ if (!(xen_start_info->flags & SIF_PRIVILEGED))
panic("Xen granted us console access "
"but not privileged status");
* Otherwise, enable for domain 0 if the machine has 'lots of memory',
* which we take to mean more than 2GB.
*/
- if (xen_start_info.flags & SIF_INITDOMAIN) {
+ if (xen_start_info->flags & SIF_INITDOMAIN) {
dom0_op_t op;
op.cmd = DOM0_PHYSINFO;
if ((HYPERVISOR_dom0_op(&op) == 0) &&
sec = tv->tv_sec;
__normalize_time(&sec, &nsec);
- if ((xen_start_info.flags & SIF_INITDOMAIN) &&
+ if ((xen_start_info->flags & SIF_INITDOMAIN) &&
!independent_wallclock) {
op.cmd = DOM0_SETTIME;
op.u.settime.secs = sec;
WARN_ON(irqs_disabled());
- if (!(xen_start_info.flags & SIF_INITDOMAIN))
+ if (!(xen_start_info->flags & SIF_INITDOMAIN))
return 0;
/* gets recalled with irq locally disabled */
pte_t *pte;
int pgd_idx, pmd_idx, pte_ofs;
- unsigned long max_ram_pfn = xen_start_info.nr_pages;
+ unsigned long max_ram_pfn = xen_start_info->nr_pages;
if (max_ram_pfn > max_low_pfn)
max_ram_pfn = max_low_pfn;
ClearPageReserved(page);
set_bit(PG_highmem, &page->flags);
set_page_count(page, 1);
- if (pfn < xen_start_info.nr_pages)
+ if (pfn < xen_start_info->nr_pages)
__free_page(page);
totalhigh_pages++;
} else
static void __init pagetable_init (void)
{
unsigned long vaddr;
- pgd_t *pgd_base = (pgd_t *)xen_start_info.pt_base;
+ pgd_t *pgd_base = (pgd_t *)xen_start_info->pt_base;
int i;
swapper_pg_dir = pgd_base;
kmap_init();
/* Switch to the real shared_info page, and clear the dummy page. */
- set_fixmap(FIX_SHARED_INFO, xen_start_info.shared_info);
+ set_fixmap(FIX_SHARED_INFO, xen_start_info->shared_info);
HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO);
memset(empty_zero_page, 0, sizeof(empty_zero_page));
#ifdef CONFIG_XEN_PHYSDEV_ACCESS
/* Setup mapping of lower 1st MB */
for (i = 0; i < NR_FIX_ISAMAPS; i++)
- if (xen_start_info.flags & SIF_PRIVILEGED)
+ if (xen_start_info->flags & SIF_PRIVILEGED)
set_fixmap(FIX_ISAMAP_BEGIN - i, i * PAGE_SIZE);
else
__set_fixmap(FIX_ISAMAP_BEGIN - i,
/* this will put all low memory onto the freelists */
totalram_pages += free_all_bootmem();
/* XEN: init and count low-mem pages outside initial allocation. */
- for (pfn = xen_start_info.nr_pages; pfn < max_low_pfn; pfn++) {
+ for (pfn = xen_start_info->nr_pages; pfn < max_low_pfn; pfn++) {
ClearPageReserved(&mem_map[pfn]);
set_page_count(&mem_map[pfn], 1);
totalram_pages++;
/*
* Don't remap the low PCI/ISA area, it's always mapped..
*/
- if (xen_start_info.flags & SIF_PRIVILEGED &&
+ if (xen_start_info->flags & SIF_PRIVILEGED &&
phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
return (void __iomem *) isa_bus_to_virt(phys_addr);
/*
* Don't remap the low PCI/ISA area, it's always mapped..
*/
- if (xen_start_info.flags & SIF_PRIVILEGED &&
+ if (xen_start_info->flags & SIF_PRIVILEGED &&
phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
return isa_bus_to_virt(phys_addr);
{
control_if_t *ctrl_if = get_ctrl_if();
- if ( xen_start_info.flags & SIF_INITDOMAIN )
+ if ( xen_start_info->flags & SIF_INITDOMAIN )
{
/*
* The initial domain must create its own domain-controller link.
op.u.bind_interdomain.port2 = 0;
if ( HYPERVISOR_event_channel_op(&op) != 0 )
BUG();
- xen_start_info.domain_controller_evtchn = op.u.bind_interdomain.port1;
+ xen_start_info->domain_controller_evtchn = op.u.bind_interdomain.port1;
initdom_ctrlif_domcontroller_port = op.u.bind_interdomain.port2;
bind_evtchn_to_cpu(op.u.bind_interdomain.port1, 0);
}
FRONT_RING_ATTACH(&ctrl_if_tx_ring, &ctrl_if->tx_ring, CONTROL_RING_MEM);
BACK_RING_ATTACH(&ctrl_if_rx_ring, &ctrl_if->rx_ring, CONTROL_RING_MEM);
- ctrl_if_evtchn = xen_start_info.domain_controller_evtchn;
+ ctrl_if_evtchn = xen_start_info->domain_controller_evtchn;
ctrl_if_irq = bind_evtchn_to_irq(ctrl_if_evtchn);
memset(&ctrl_if_irq_action, 0, sizeof(ctrl_if_irq_action));
HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
clear_fixmap(FIX_SHARED_INFO);
- memcpy(&suspend_record->resume_info, &xen_start_info,
- sizeof(xen_start_info));
+ memcpy(&suspend_record->resume_info, xen_start_info,
+ sizeof(*xen_start_info));
/* We'll stop somewhere inside this hypercall. When it returns,
we'll start resuming after the restore. */
shutting_down = SHUTDOWN_INVALID;
- memcpy(&xen_start_info, &suspend_record->resume_info,
- sizeof(xen_start_info));
+ memcpy(xen_start_info, &suspend_record->resume_info,
+ sizeof(*xen_start_info));
- set_fixmap(FIX_SHARED_INFO, xen_start_info.shared_info);
+ set_fixmap(FIX_SHARED_INFO, xen_start_info->shared_info);
HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO);
*/
unsigned long __init e820_end_of_ram(void)
{
- unsigned long max_end_pfn = xen_start_info.nr_pages;
+ unsigned long max_end_pfn = xen_start_info->nr_pages;
if ( xen_override_max_pfn < max_end_pfn)
xen_override_max_pfn = max_end_pfn;
.globl startup_64
startup_64:
ENTRY(_start)
- cld
- /* Copy the necessary stuff from xen_start_info structure. */
- movq $xen_start_info_union,%rdi
- movq $256,%rcx
- rep movsq
+ movq %rsi,xen_start_info(%rip)
#ifdef CONFIG_SMP
- ENTRY(startup_64_smp)
- cld
+ENTRY(startup_64_smp)
#endif /* CONFIG_SMP */
+ cld
+
movq init_rsp(%rip),%rsp
/* zero EFLAGS after setting rsp */
pushq $0
{
int i;
- phys_to_machine_mapping = (u32 *)xen_start_info.mfn_list;
- start_pfn = (__pa(xen_start_info.pt_base) >> PAGE_SHIFT) + xen_start_info.nr_pt_frames;
+ phys_to_machine_mapping = (u32 *)xen_start_info->mfn_list;
+ start_pfn = (__pa(xen_start_info->pt_base) >> PAGE_SHIFT) +
+ xen_start_info->nr_pt_frames;
for (i = 0; i < 256; i++)
set_intr_gate(i, early_idt_handler);
DEFINE_PER_CPU(int, nr_multicall_ents);
/* Raw start-of-day parameters from the hypervisor. */
-union xen_start_info_union xen_start_info_union;
+start_info_t *xen_start_info;
#endif
/*
if ((max_cmdline = MAX_GUEST_CMDLINE) > COMMAND_LINE_SIZE)
max_cmdline = COMMAND_LINE_SIZE;
- memcpy(saved_command_line, xen_start_info.cmd_line, max_cmdline);
+ memcpy(saved_command_line, xen_start_info->cmd_line, max_cmdline);
saved_command_line[max_cmdline-1] = '\0';
#else
memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
#endif
#ifdef CONFIG_XEN
#ifdef CONFIG_BLK_DEV_INITRD
- if (xen_start_info.mod_start) {
+ if (xen_start_info->mod_start) {
if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) {
/*reserve_bootmem_generic(INITRD_START, INITRD_SIZE);*/
initrd_start = INITRD_START + PAGE_OFFSET;
{
int i, j;
/* Make sure we have a large enough P->M table. */
- if (end_pfn > xen_start_info.nr_pages) {
+ if (end_pfn > xen_start_info->nr_pages) {
phys_to_machine_mapping = alloc_bootmem(
end_pfn * sizeof(u32));
memset(phys_to_machine_mapping, ~0,
end_pfn * sizeof(u32));
memcpy(phys_to_machine_mapping,
- (u32 *)xen_start_info.mfn_list,
- xen_start_info.nr_pages * sizeof(u32));
+ (u32 *)xen_start_info->mfn_list,
+ xen_start_info->nr_pages * sizeof(u32));
free_bootmem(
- __pa(xen_start_info.mfn_list),
- PFN_PHYS(PFN_UP(xen_start_info.nr_pages *
+ __pa(xen_start_info->mfn_list),
+ PFN_PHYS(PFN_UP(xen_start_info->nr_pages *
sizeof(u32))));
}
op.u.set_iopl.iopl = 1;
HYPERVISOR_physdev_op(&op);
- if (xen_start_info.flags & SIF_INITDOMAIN) {
- if (!(xen_start_info.flags & SIF_PRIVILEGED))
+ if (xen_start_info->flags & SIF_INITDOMAIN) {
+ if (!(xen_start_info->flags & SIF_PRIVILEGED))
panic("Xen granted us console access "
"but not privileged status");
int readonly = 0;
/* Make old and new page tables read-only. */
- if ((paddr >= (xen_start_info.pt_base - __START_KERNEL_map))
+ if ((paddr >= (xen_start_info->pt_base - __START_KERNEL_map))
&& (paddr < ((table_start << PAGE_SHIFT) + tables_space)))
readonly = 1;
/*
pte_save = pte;
for (k = 0; k < PTRS_PER_PTE; pte++, k++, paddr += PTE_SIZE) {
if ((paddr >= end) ||
- ((paddr >> PAGE_SHIFT)
- >= xen_start_info.nr_pages)) {
+ ((paddr >> PAGE_SHIFT) >=
+ xen_start_info->nr_pages)) {
__set_pte(pte, __pte(0));
continue;
}
memset((void *)level2_kernel_pgt, 0, PAGE_SIZE);
/* Find the initial pte page that was built for us. */
- page = (unsigned long *)xen_start_info.pt_base;
+ page = (unsigned long *)xen_start_info->pt_base;
addr = page[pgd_index(__START_KERNEL_map)];
addr_to_page(addr, page);
addr = page[pud_index(__START_KERNEL_map)];
free_area_init(zones_size);
}
- set_fixmap(FIX_SHARED_INFO, xen_start_info.shared_info);
+ set_fixmap(FIX_SHARED_INFO, xen_start_info->shared_info);
HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO);
memset(empty_zero_page, 0, sizeof(empty_zero_page));
int i;
/* Setup mapping of lower 1st MB */
for (i = 0; i < NR_FIX_ISAMAPS; i++)
- if (xen_start_info.flags & SIF_PRIVILEGED)
+ if (xen_start_info->flags & SIF_PRIVILEGED)
set_fixmap(FIX_ISAMAP_BEGIN - i, i * PAGE_SIZE);
else
__set_fixmap(FIX_ISAMAP_BEGIN - i,
IPRINTK("Initialising balloon driver.\n");
- current_pages = min(xen_start_info.nr_pages, max_pfn);
+ current_pages = min(xen_start_info->nr_pages, max_pfn);
target_pages = current_pages;
balloon_low = 0;
balloon_high = 0;
balloon_pde->write_proc = balloon_write;
/* Initialise the balloon with excess memory space. */
- for (pfn = xen_start_info.nr_pages; pfn < max_pfn; pfn++) {
+ for (pfn = xen_start_info->nr_pages; pfn < max_pfn; pfn++) {
page = &mem_map[pfn];
if (!PageReserved(page))
balloon_append(page);
int i;
struct page *page;
- if ( !(xen_start_info.flags & SIF_INITDOMAIN) &&
- !(xen_start_info.flags & SIF_BLK_BE_DOMAIN) )
+ if ( !(xen_start_info->flags & SIF_INITDOMAIN) &&
+ !(xen_start_info->flags & SIF_BLK_BE_DOMAIN) )
return 0;
blkif_interface_init();
static int __init xlblk_init(void)
{
- if ((xen_start_info.flags & SIF_INITDOMAIN)
- || (xen_start_info.flags & SIF_BLK_BE_DOMAIN) )
+ if ((xen_start_info->flags & SIF_INITDOMAIN) ||
+ (xen_start_info->flags & SIF_BLK_BE_DOMAIN) )
return 0;
IPRINTK("Initialising virtual block device driver\n");
int i, j, err;
struct page *page;
/*
- if ( !(xen_start_info.flags & SIF_INITDOMAIN) &&
- !(xen_start_info.flags & SIF_BLK_BE_DOMAIN) )
+ if ( !(xen_start_info->flags & SIF_INITDOMAIN) &&
+ !(xen_start_info->flags & SIF_BLK_BE_DOMAIN) )
return 0;
*/
blkif_interface_init();
void xen_console_init(void)
#endif
{
- if ( xen_start_info.flags & SIF_INITDOMAIN )
+ if ( xen_start_info->flags & SIF_INITDOMAIN )
{
if ( xc_mode == XC_DEFAULT )
xc_mode = XC_SERIAL;
int sz;
/* Emergency console is synchronous, so there's nothing to flush. */
- if ( xen_start_info.flags & SIF_INITDOMAIN )
+ if ( xen_start_info->flags & SIF_INITDOMAIN )
return;
{
int sz, work_done = 0;
- if ( xen_start_info.flags & SIF_INITDOMAIN )
+ if ( xen_start_info->flags & SIF_INITDOMAIN )
{
if ( x_char )
{
tty_register_device(xencons_driver, 0, NULL);
#endif
- if ( xen_start_info.flags & SIF_INITDOMAIN )
+ if ( xen_start_info->flags & SIF_INITDOMAIN )
{
xencons_priv_irq = bind_virq_to_irq(VIRQ_CONSOLE);
(void)request_irq(xencons_priv_irq,
static inline struct ring_head *outring(void)
{
- return machine_to_virt(xen_start_info.console_mfn << PAGE_SHIFT);
+ return machine_to_virt(xen_start_info->console_mfn << PAGE_SHIFT);
}
static inline struct ring_head *inring(void)
{
- return machine_to_virt(xen_start_info.console_mfn << PAGE_SHIFT)
+ return machine_to_virt(xen_start_info->console_mfn << PAGE_SHIFT)
+ PAGE_SIZE/2;
}
int sent = 0;
sent = __xencons_ring_send(out, data, len);
- notify_via_evtchn(xen_start_info.console_evtchn);
+ notify_via_evtchn(xen_start_info->console_evtchn);
return sent;
}
{
int err;
- if (!xen_start_info.console_evtchn)
+ if (!xen_start_info->console_evtchn)
return 0;
- err = bind_evtchn_to_irqhandler(xen_start_info.console_evtchn,
+ err = bind_evtchn_to_irqhandler(xen_start_info->console_evtchn,
handle_input, 0, "xencons", inring());
if (err) {
xprintk("XEN console request irq failed %i\n", err);
void xencons_suspend(void)
{
- if (!xen_start_info.console_evtchn)
+ if (!xen_start_info->console_evtchn)
return;
- unbind_evtchn_from_irqhandler(xen_start_info.console_evtchn, inring());
+ unbind_evtchn_from_irqhandler(xen_start_info->console_evtchn,
+ inring());
}
void xencons_resume(void)
int i;
struct page *page;
- if ( !(xen_start_info.flags & SIF_NET_BE_DOMAIN) &&
- !(xen_start_info.flags & SIF_INITDOMAIN) )
+ if ( !(xen_start_info->flags & SIF_NET_BE_DOMAIN) &&
+ !(xen_start_info->flags & SIF_INITDOMAIN) )
return 0;
IPRINTK("Initialising Xen netif backend.\n");
{
int err = 0;
- if (xen_start_info.flags & SIF_INITDOMAIN)
+ if (xen_start_info->flags & SIF_INITDOMAIN)
return 0;
if ((err = xennet_proc_init()) != 0)
extern int do_xenbus_probe(void*);
unsigned long page;
- if (xen_start_info.store_evtchn != 0) {
- ret = xen_start_info.store_mfn;
+ if (xen_start_info->store_evtchn != 0) {
+ ret = xen_start_info->store_mfn;
break;
}
SetPageReserved(virt_to_page(page));
/* Initial connect. Setup channel and page. */
- xen_start_info.store_evtchn = data;
- xen_start_info.store_mfn = pfn_to_mfn(virt_to_phys((void *)page) >>
+ xen_start_info->store_evtchn = data;
+ xen_start_info->store_mfn = pfn_to_mfn(virt_to_phys((void *)page) >>
PAGE_SHIFT);
- ret = xen_start_info.store_mfn;
+ ret = xen_start_info->store_mfn;
/* We'll return then this will wait for daemon to answer */
kthread_run(do_xenbus_probe, NULL, "xenbus_probe");
tpmback_init(void)
{
int rc;
- if (!(xen_start_info.flags & SIF_TPM_BE_DOMAIN) &&
- !(xen_start_info.flags & SIF_INITDOMAIN)) {
+ if (!(xen_start_info->flags & SIF_TPM_BE_DOMAIN) &&
+ !(xen_start_info->flags & SIF_INITDOMAIN)) {
printk(KERN_ALERT "Neither TPM-BE Domain nor INIT domain!\n");
return 0;
}
int i;
struct page *page;
- if ( !(xen_start_info.flags & SIF_INITDOMAIN) &&
- !(xen_start_info.flags & SIF_USB_BE_DOMAIN) )
+ if ( !(xen_start_info->flags & SIF_INITDOMAIN) &&
+ !(xen_start_info->flags & SIF_USB_BE_DOMAIN) )
return 0;
page = balloon_alloc_empty_page_range(MMAP_PAGES);
{
int retval = -ENOMEM, i;
- if ( (xen_start_info.flags & SIF_INITDOMAIN)
- || (xen_start_info.flags & SIF_USB_BE_DOMAIN) )
+ if ( (xen_start_info->flags & SIF_INITDOMAIN) ||
+ (xen_start_info->flags & SIF_USB_BE_DOMAIN) )
return 0;
info(DRIVER_DESC " " DRIVER_VERSION);
static inline struct ringbuf_head *outbuf(void)
{
- return mfn_to_virt(xen_start_info.store_mfn);
+ return mfn_to_virt(xen_start_info->store_mfn);
}
static inline struct ringbuf_head *inbuf(void)
{
- return mfn_to_virt(xen_start_info.store_mfn) + PAGE_SIZE/2;
+ return mfn_to_virt(xen_start_info->store_mfn) + PAGE_SIZE/2;
}
static irqreturn_t wake_waiting(int irq, void *unused, struct pt_regs *regs)
data += avail;
len -= avail;
update_output_chunk(out, avail);
- notify_via_evtchn(xen_start_info.store_evtchn);
+ notify_via_evtchn(xen_start_info->store_evtchn);
} while (len != 0);
return 0;
pr_debug("Finished read of %i bytes (%i to go)\n", avail, len);
/* If it was full, tell them we've taken some. */
if (was_full)
- notify_via_evtchn(xen_start_info.store_evtchn);
+ notify_via_evtchn(xen_start_info->store_evtchn);
}
/* If we left something, wake watch thread to deal with it. */
{
int err;
- if (!xen_start_info.store_evtchn)
+ if (!xen_start_info->store_evtchn)
return 0;
err = bind_evtchn_to_irqhandler(
- xen_start_info.store_evtchn, wake_waiting,
+ xen_start_info->store_evtchn, wake_waiting,
0, "xenbus", &xb_waitq);
if (err) {
printk(KERN_ERR "XENBUS request irq failed %i\n", err);
- unbind_evtchn_from_irq(xen_start_info.store_evtchn);
+ unbind_evtchn_from_irq(xen_start_info->store_evtchn);
return err;
}
/* FIXME zero out page -- domain builder should probably do this*/
- memset(mfn_to_virt(xen_start_info.store_mfn), 0, PAGE_SIZE);
+ memset(mfn_to_virt(xen_start_info->store_mfn), 0, PAGE_SIZE);
return 0;
}
void xb_suspend_comms(void)
{
- if (!xen_start_info.store_evtchn)
+ if (!xen_start_info->store_evtchn)
return;
- unbind_evtchn_from_irqhandler(xen_start_info.store_evtchn, &xb_waitq);
+ unbind_evtchn_from_irqhandler(xen_start_info->store_evtchn, &xb_waitq);
}
down(&xenbus_lock);
- if (xen_start_info.store_evtchn) {
+ if (xen_start_info->store_evtchn) {
ret = nb->notifier_call(nb, 0, NULL);
} else {
notifier_chain_register(&xenstore_chain, nb);
int err = 0;
/* Initialize xenstore comms unless already done. */
- printk("store_evtchn = %i\n", xen_start_info.store_evtchn);
+ printk("store_evtchn = %i\n", xen_start_info->store_evtchn);
err = xs_init();
if (err) {
printk("XENBUS: Error initializing xenstore comms:"
device_register(&xenbus_frontend.dev);
device_register(&xenbus_backend.dev);
- if (!xen_start_info.store_evtchn)
+ if (!xen_start_info->store_evtchn)
return 0;
do_xenbus_probe(NULL);
static char * __init machine_specific_memory_setup(void)
{
- unsigned long max_pfn = xen_start_info.nr_pages;
+ unsigned long max_pfn = xen_start_info->nr_pages;
e820.nr_map = 0;
add_memory_region(0, PFN_PHYS(max_pfn), E820_RAM);
clear_bit(X86_FEATURE_PSE, c->x86_capability);
clear_bit(X86_FEATURE_PGE, c->x86_capability);
clear_bit(X86_FEATURE_SEP, c->x86_capability);
- if (!(xen_start_info.flags & SIF_PRIVILEGED))
+ if (!(xen_start_info->flags & SIF_PRIVILEGED))
clear_bit(X86_FEATURE_MTRR, c->x86_capability);
}
#define AUX_DEVICE_INFO (*(unsigned char *) (PARAM+0x1FF))
#define LOADER_TYPE (*(unsigned char *) (PARAM+0x210))
#define KERNEL_START (*(unsigned long *) (PARAM+0x214))
-#define INITRD_START (__pa(xen_start_info.mod_start))
-#define INITRD_SIZE (xen_start_info.mod_len)
+#define INITRD_START (__pa(xen_start_info->mod_start))
+#define INITRD_SIZE (xen_start_info->mod_len)
#define EDID_INFO (*(struct edid_info *) (PARAM+0x440))
#define EDD_NR (*(unsigned char *) (PARAM+EDDNR))
#define EDD_MBR_SIG_NR (*(unsigned char *) (PARAM+EDD_MBR_SIG_NR_BUF))
#define LOADER_TYPE (*(unsigned char *) (PARAM+0x210))
#define KERNEL_START (*(unsigned int *) (PARAM+0x214))
-#define INITRD_START (__pa(xen_start_info.mod_start))
-#define INITRD_SIZE (xen_start_info.mod_len)
+#define INITRD_START (__pa(xen_start_info->mod_start))
+#define INITRD_SIZE (xen_start_info->mod_len)
#define EDID_INFO (*(struct edid_info *) (PARAM+0x440))
#define EDD_NR (*(unsigned char *) (PARAM+EDDNR))
who = "Xen";
start_pfn = 0;
- max_pfn = xen_start_info.nr_pages;
+ max_pfn = xen_start_info->nr_pages;
e820.nr_map = 0;
add_memory_region(PFN_PHYS(start_pfn), PFN_PHYS(max_pfn) - PFN_PHYS(start_pfn), E820_RAM);
clear_bit(X86_FEATURE_PSE, c->x86_capability);
clear_bit(X86_FEATURE_PGE, c->x86_capability);
clear_bit(X86_FEATURE_SEP, c->x86_capability);
- if (!(xen_start_info.flags & SIF_PRIVILEGED))
+ if (!(xen_start_info->flags & SIF_PRIVILEGED))
clear_bit(X86_FEATURE_MTRR, c->x86_capability);
}
#endif
/* arch/xen/i386/kernel/setup.c */
-union xen_start_info_union
-{
- start_info_t xen_start_info;
- char padding[2048];
-};
-extern union xen_start_info_union xen_start_info_union;
-#define xen_start_info (xen_start_info_union.xen_start_info)
+extern start_info_t *xen_start_info;
/* arch/xen/kernel/evtchn.c */
/* Force a proper event-channel callback from Xen. */
vinitrd_end = vinitrd_start + initrd_len;
vphysmap_start = round_pgup(vinitrd_end);
vphysmap_end = vphysmap_start + (nr_pages * sizeof(unsigned long));
- vstoreinfo_start = round_pgup(vphysmap_end);
+ vstartinfo_start = round_pgup(vphysmap_end);
+ vstartinfo_end = vstartinfo_start + PAGE_SIZE;
+ vstoreinfo_start = vstartinfo_end;
vstoreinfo_end = vstoreinfo_start + PAGE_SIZE;
vconsole_start = vstoreinfo_end;
- vconsole_end = vstoreinfo_end + PAGE_SIZE;
+ vconsole_end = vconsole_start + PAGE_SIZE;
vpt_start = vconsole_end;
for ( nr_pt_pages = 2; ; nr_pt_pages++ )
{
vpt_end = vpt_start + (nr_pt_pages * PAGE_SIZE);
- vstartinfo_start = vpt_end;
- vstartinfo_end = vstartinfo_start + PAGE_SIZE;
- vstack_start = vstartinfo_end;
+ vstack_start = vpt_end;
vstack_end = vstack_start + PAGE_SIZE;
v_end = (vstack_end + (1UL<<22)-1) & ~((1UL<<22)-1);
if ( (v_end - vstack_end) < (512UL << 10) )
" Loaded kernel: %p->%p\n"
" Init. ramdisk: %p->%p\n"
" Phys-Mach map: %p->%p\n"
+ " Start info: %p->%p\n"
" Store page: %p->%p\n"
" Console page: %p->%p\n"
" Page tables: %p->%p\n"
- " Start info: %p->%p\n"
" Boot stack: %p->%p\n"
" TOTAL: %p->%p\n",
_p(dsi.v_kernstart), _p(dsi.v_kernend),
_p(vinitrd_start), _p(vinitrd_end),
_p(vphysmap_start), _p(vphysmap_end),
+ _p(vstartinfo_start), _p(vstartinfo_end),
_p(vstoreinfo_start), _p(vstoreinfo_end),
_p(vconsole_start), _p(vconsole_end),
_p(vpt_start), _p(vpt_end),
- _p(vstartinfo_start), _p(vstartinfo_end),
_p(vstack_start), _p(vstack_end),
_p(dsi.v_start), _p(v_end));
printf(" ENTRY ADDRESS: %p\n", _p(dsi.v_kernentry));
vinitrd_end = vinitrd_start + initrd_len;
vphysmap_start = round_pgup(vinitrd_end);
vphysmap_end = vphysmap_start + (nr_pages * sizeof(u32));
- vpt_start = round_pgup(vphysmap_end);
+ vstartinfo_start = round_pgup(vphysmap_end);
+ vstartinfo_end = vstartinfo_start + PAGE_SIZE;
+ vpt_start = vstartinfo_end;
for ( nr_pt_pages = 2; ; nr_pt_pages++ )
{
vpt_end = vpt_start + (nr_pt_pages * PAGE_SIZE);
- vstartinfo_start = vpt_end;
- vstartinfo_end = vstartinfo_start + PAGE_SIZE;
- vstack_start = vstartinfo_end;
+ vstack_start = vpt_end;
vstack_end = vstack_start + PAGE_SIZE;
v_end = (vstack_end + (1UL<<22)-1) & ~((1UL<<22)-1);
if ( (v_end - vstack_end) < (512UL << 10) )
" Loaded kernel: %p->%p\n"
" Init. ramdisk: %p->%p\n"
" Phys-Mach map: %p->%p\n"
- " Page tables: %p->%p\n"
" Start info: %p->%p\n"
+ " Page tables: %p->%p\n"
" Boot stack: %p->%p\n"
" TOTAL: %p->%p\n",
_p(dsi.v_kernstart), _p(dsi.v_kernend),
_p(vinitrd_start), _p(vinitrd_end),
_p(vphysmap_start), _p(vphysmap_end),
- _p(vpt_start), _p(vpt_end),
_p(vstartinfo_start), _p(vstartinfo_end),
+ _p(vpt_start), _p(vpt_end),
_p(vstack_start), _p(vstack_end),
_p(dsi.v_start), _p(v_end));
printk(" ENTRY ADDRESS: %p\n", _p(dsi.v_kernentry));